"""
Author: Jian SuiYue kaohx0214@yeah.net
Date: 2025-04-23 00:43:30
LastEditTime: 2025-05-15 17:12:45
FilePath: LibraryManagerStudio/web/deps.py
"""
import logging
import os
import sys
from pathlib import Path
from typing import Optional, Dict

from fastapi import Depends
from sqlmodel import Session
from starlette import status
from starlette.exceptions import HTTPException

from .config import settings
from ..database import DBManager, setup_loggers

# 添加父目录到Python路径
current_dir = os.path.dirname(os.path.abspath(__file__))
parent_dir = os.path.dirname(current_dir)
if parent_dir not in sys.path:
    sys.path.insert(0, parent_dir)

logger = logging.getLogger(__name__)

# 全局数据库管理器实例
_db_manager: Optional[DBManager] = None


async def init_managers(db_uri: str, config_dir: Path, app_root: Path) -> None:
    """
    初始化所有必要的管理器。
    当应用程序启动时调用。
    
    Args:
        db_uri: 数据库URI
        config_dir: 配置文件目录
        app_root: 应用程序根目录
    """
    global _db_manager

    logger.info("Initializing managers...")

    try:
        logs_dir = app_root / "logs"
        setup_loggers(logs_dir)
        
        # 初始化数据库管理器
        logger.info(f"Initialze database message: {db_uri}")
        _db_manager = DBManager(db_uri, app_root)
        _db_manager.initialize_database(auto_upgrade=settings.UPGRADE_DATABASE)

        

        logger.info("Database manager initialize success")

    except Exception as ex:
        logger.error(f"Error while initialize manager : {str(ex)}")
        raise


async def cleanup_resources() -> None:
    """
    清理资源。
    当应用程序关闭时调用。
    """
    global _db_manager

    # 清理数据库连接
    if _db_manager is not None:
        try:
            _db_manager.close()
            logger.info("数据库连接已关闭")
        except Exception as ex:
            logger.error(f"关闭数据库连接时出错: {str(ex)}")

    # 清理其他资源


async def get_db() -> DBManager:
    """
    获取数据库管理器实例。
    作为依赖项注入到路由处理函数中。
    
    Returns:
        DBManager: 数据库管理器实例
    
    Raises:
        RuntimeError: 如果数据库管理器尚未初始化
    """
    if _db_manager is None:
        raise RuntimeError("数据库管理器尚未初始化")
    return _db_manager


def get_db_session() -> Session | None:
    """获取用于日志记录的数据库会话"""
    try:
        db_manager: DBManager = Depends(get_db)
        return db_manager.get_session()
    except Exception as e:
        logger.error(f"Error: failed at get database session to write log: {str(e)}")
        # 返回None而不是抛出异常，以防日志系统本身失败
        return None


async def get_current_user(token: str = Depends(lambda: None)) -> Dict:
    """
    获取当前用户信息
    
    Args:
        token: 授权令牌
    
    Returns:
        用户信息字典
    
    Raises:
        HTTPException: 如果授权失败
    """
    # 这里可以添加从token获取用户信息的逻辑
    # 目前为简化实现，返回一个模拟的用户信息
    return {"uid": "admin", "username": "管理员", "is_admin": True}


def verify_admin(current_user: Dict = Depends(get_current_user)) -> Dict:
    """
    验证当前用户是否是管理员
    
    Args:
        current_user: 当前用户信息
    
    Returns:
        用户信息字典
    
    Raises:
        HTTPException: 如果用户不是管理员
    """
    if not current_user.get("is_admin", False):
        logger.warning(f"非管理员用户 {current_user.get('username')} 尝试访问管理员API")
        raise HTTPException(
            status_code=status.HTTP_403_FORBIDDEN,
            detail="需要管理员权限"
        )
    return current_user
